//     内部类
//          1.鼠标右键TestDemo.java -> Open in ->Explorer 查看类 一个类对应一个字节码文件
//            内部类比较特殊 例如OuterClass$InnerClass.class 该字节码文件
//                                  外部类$内部类
//本地内部类（了解   ）
//实例内部类(链表)
class MyLinkedList {
    class Node {

    }
}
//  1.在实例内部类中 不能定义一个静态的成员变量 非要定义 只能定义一个 静态常量(final)
//  2.如何实例化   实例化内部类的对象        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
//      外部类名.内部类名  变量 = 外部内对象的引用.new 内部类
//  3.内部类里面可以写一个内部类  该内部类还是有类的基本特性    继承 接口...
//  4.InnerClass里面


//静态内部类
//匿名内部类



//定义一个接口
interface A {

}
class OuterClass {
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;


//    实例内部类：可以把他当做 是外部类的一个普通实例的成员
    class InnerClass {
        public int data1 = 999;
        public int data4 = 4;
        private int data5 = 5;
//        public static int data6 = 6;error 属于类的  不属于成员
        public static final int data6 = 6;


        public InnerClass() {
            System.out.println("不带参数的内部类构造方法");
        }
        public void test() {
//            都可以打印  但是实例内部类中如果包含了和外部类同名的 成员变量 那么如何在实例内部类当中访问外部类同名变量？？
//            提示：data打印的是999  如何打印出1？
//             加this.data1   不行 因为this.是当前对象的引用 打印出还是999
            System.out.println(this.data1);//999
//            所以我们该如何访问呢？
//            System.out.println(OuterClass.data1);error
//            System.out.println(OuterClass.data3);√
            System.out.println(OuterClass.this.data1);//1
//            总结 ：
//              实例内部类当中 包含两个this 一个是外部类的this  一个是自己的this



            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
            System.out.println("InnerClass::test()");
        }
    }

    public void func1() {
//        static int a = 1;error 属于类的  不属于对象
        System.out.println("OutClass::func1()");
    }
}





public class TestDemo extends OuterClass.InnerClass{//继承内部类 需要添加
//    代码
    public TestDemo(OuterClass out) {
        out.super();
    }



    public void fun() {
//        本地内部类   缺点只能在当前方法当中使用
        class Test{
            public int a;
        }
    }


    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();//拿到一个外部类对象
        outerClass.func1();//OutClass::func1()

//        InnerClass innerClass = new InnerClass();error

//        实例化内部类对象
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();//不带参数的内部类构造方法
        innerClass.test();
        //999
        //1
        //2
        //3
        //4
        //5
        //6
        //InnerClass::test()

    }
}
